package com.share.common.config;

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * SpringDoc OpenAPI 3 配置类
 * 替代原有的 Knife4j Swagger2 配置
 *
 * API 文档访问地址:
 * - Swagger UI: http://localhost:8090/share/swagger-ui/index.html
 * - OpenAPI JSON: http://localhost:8090/share/v3/api-docs
 */
@Configuration
public class OpenApiConfig {

    private static final String SECURITY_SCHEME_NAME = "JWT Token";

    /**
     * 配置 OpenAPI 文档信息
     */
    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                // 配置API基本信息
                .info(apiInfo())
                // 配置JWT认证
                .components(components())
                // 全局添加JWT认证要求
                .addSecurityItem(securityRequirement());
    }

    /**
     * API 基本信息
     */
    private Info apiInfo() {
        return new Info()
                .title("股票管理系统 API")
                .description("基于 Spring Boot + MyBatis-Plus 的股票分析管理系统 API 文档")
                .version("1.0.0")
                .contact(new Contact()
                        .name("lijy")
                        .email("lijy@example.com")
                        .url(""))
                .license(new License()
                        .name("Apache 2.0")
                        .url("https://www.apache.org/licenses/LICENSE-2.0.html"));
    }

    /**
     * 配置认证组件
     */
    private Components components() {
        return new Components()
                .addSecuritySchemes(SECURITY_SCHEME_NAME, securityScheme());
    }

    /**
     * JWT 认证方案配置
     * 客户端需要在请求头中添加: token: <JWT令牌>
     */
    private SecurityScheme securityScheme() {
        return new SecurityScheme()
                .name("token")
                .type(SecurityScheme.Type.APIKEY)
                .in(SecurityScheme.In.HEADER)
                .description("请在下方输入JWT令牌,无需添加 'Bearer ' 前缀");
    }

    /**
     * 全局安全要求
     */
    private SecurityRequirement securityRequirement() {
        return new SecurityRequirement()
                .addList(SECURITY_SCHEME_NAME);
    }
}
